#include <regex>
#include <string>
#include <iostream>
using namespace std;

// GET /bitejiuyeke/login?user=xiaoming&pass=123123 HTTP/1.1
int main()
{
    //?user=xiaoming&pass=123123
    std::string str = "GET /bitejiuyeke/login HTTP/1.1";
    std::smatch matchers; // 匹配成功后的容器
    /*

        GET|POST|HEAD|PUT|DELETE 代表匹配其中之一的字符串 （GET|POST|HEAD|PUT|DELETE） 加上括号就是进行提取
        字符集 [] 用于匹配括号内的任意一个字符。 [^abc]	取反。匹配不在括号内的任意字符。[^?] 匹配不是问号的所有字符
        量词 * 匹配前面的表达式 0 次 或 多次。 [^?]* 就是匹配不是？的字符 0次或多次 量词： ？ 匹配前面的表达式 0 次 或 1次
        元字符 . 表示匹配任意字符 除了换行符   .* 就代表匹配任意0个或者多个字符除了换行符

        (?:\\?(.*))? : 里面是两个捕获组 一个是 \\?(.*) 就是以？开头后面任意字符进行捕获 里面还有一个捕获组就是.*就是把？后面的任意字符进行捕获
        我们为了不要捕获我们外层的我们可以在外层加上？:就是不进行捕获外层的
        我们提取几次就会有几个字符串加上本身这个字符串的个数

    */
    std::regex match("(GET|POST|HEAD|PUT|DELETE) ([^?]*)(?:\\?(.*))? (HTTP/1.[0|1])(?:\n|\r\n)?", std::regex::icase);
    bool ret = std::regex_match(str, matchers, match);
    if (ret == false)
    {
        return 0;
    }
    for (auto &ch : matchers)
    {
        cout << ch << std::endl;
    }
    std::cout << matchers.size() << std::endl;
    return 0;
}